package vengadores;


import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.game.GameCanvas;

/**
 * Crea el menú principal del juego y el de selección de personaje. La creación de estos menús depende de una constante
 * numérica que se declara en el constructor
 * @author Felipe Donato Arrazola Gómez
 * @author Jorge de Jesús Tinoco Huesca
 * @author Arturo Ayala Tello
 */
public class Menu extends GameCanvas implements Animable{

    /**
     * Variable que guarda la imagen del menú
     */
    protected Fondo fondoMenu;
    /**
     * Constante numérica que representa el ancho de la pantalla
     */
    protected final int ANCHO;
    /**
     * Constante numérica que representa el alto de la pantalla
     */
    protected final int ALTO;
    private AppJuego midlet;// es la aplicación a la cual pertenece el menú
    private Graphics g;// es el entorno gráfico en el cual se dibujan todos los objetos
    private AnimadorMenu animador; // es el animador que se encarga del movimiento
    private boolean botonApretado = false; // usado para el control de presionado de las teclas
    protected boolean movimientoIzq = false, movimientoDer = false; // guardan si se mueven para la izquierda o para la derecha
    protected int indice;//es la opcion actual del menú
    private int tipo; // es el tipo de menú creado
    /**
     * Constante numérica con valor de 0, que representa un menú principal
     */
    public static final int PRINCIPAL = 0;
    /**
     * Constante numérica con valor de 1, que representa un menú de selección de personaje
     */
    public static final int SELECCION = 1;

    /**
     * Constructor de la clase. Inicializa el midlet, los valores de ANCHO y ALTO y posiciona el menu en la opción inicial.
     * @param app Recibe un midlet en donde se ejecutará el menú.
     * @param tipo Recibe un int que hace la creación al si es de tipo principal o de selección de personaje.
     * @param opcion Recibe un int y es donde posiciona el menú de manera inicial.
     *
     */

    public Menu(AppJuego app, int tipo, int opcion){
       super(true);
        // Hace la inicialización
        midlet = app;
        System.out.println(midlet.estaReproduciendo());
        this.setFullScreenMode(true);
        ANCHO = this.getWidth();
        ALTO = this.getHeight();
        g = getGraphics();
        this.tipo = tipo;
        try {
            if (this.tipo == PRINCIPAL){
                fondoMenu = new Fondo("/MenuCompleto.png");
                if(!midlet.estaReproduciendo() && midlet.deseaReproducir())
                    midlet.reproducir("fwtbt.mid");
            }else if(this.tipo == SELECCION){
                fondoMenu = new Fondo("/SeleccionPersonaje.png");
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        setPosicion(opcion);
        animador = new AnimadorMenu(this);
        animador.iniciar();


    }

    /**
     * Método que checa el teclado y si es que se selecciona alguna opción.
     * @throws Exception si el sonido del menú seleccionar personaje no se encuentra.
     */

    public void checarTeclas(){
        int keyState = getKeyStates();
        if (tipo == PRINCIPAL){
            if ((keyState & LEFT_PRESSED) != 0 && !botonApretado){
                movimientoIzq = true;
                botonApretado = true;
            }else if((keyState & RIGHT_PRESSED) != 0 && !botonApretado){
                movimientoDer = true;
                botonApretado = true;
            }else if((keyState & FIRE_PRESSED) !=0 && !botonApretado){
                botonApretado = true;
                try {
                    siguientePantalla();
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
                return;
            }else if( keyState == 0){
                botonApretado = false;
            }
        }else if(tipo == SELECCION){
            if ((keyState & LEFT_PRESSED) != 0 && !botonApretado){
                if (midlet.deseaReproducir()){
                    try{
                        midlet.reproducir("reload.wav");
                    }catch(Exception e){
                        e.printStackTrace();
                    }
                }
                movimientoIzq = true;
                botonApretado = true;
            }else if((keyState & RIGHT_PRESSED) != 0 && !botonApretado){
                if (midlet.deseaReproducir()){
                    try{
                        midlet.reproducir("reload.wav");
                    }catch(Exception e){
                        e.printStackTrace();
                    }
                }
                movimientoDer = true;
                botonApretado = true;
            }else if((keyState & FIRE_PRESSED) !=0 && !botonApretado){
                try {
                    siguientePantalla();
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }else if( keyState == 0){
                botonApretado = false;
            }
        }
    }
    /**
     *Método que regresa el tipo de menú creado
     * @return el tipo de mené que se está manejando.
     */
    public int getTipo(){
        return tipo;
    }

    /**
     * Método que desplaza el menú dependiendo qué parámetro esté activo si movDerecha o movIzquierda.
     */
    public void actualizar() {
       if (movimientoIzq){
           fondoMenu.mover(20);
       }else if (movimientoDer){
           fondoMenu.mover(-20);
       }
    }
    /**
     * Método para dibujar el menú en un entorno gráfico.
     */
    public void dibujar() {
        g.setColor(0x000000);   // negro
        g.fillRect(0, 0, ANCHO, ALTO);
        fondoMenu.dibujar(g);
        flushGraphics();
    }
    /**
     * Método que hace el cambio entre pantallas al seleccionar una opción del menú.
     */
    public void siguientePantalla() throws Exception{
        if (tipo == PRINCIPAL){
            switch (indice){
                case 0:
                    terminar();
                    midlet.ponerPantalla(new Historia(midlet,0,0,0));
                    midlet = null;
                    break;
                case 1:
                    if (midlet.getNivelGuardado() == 0){
                        terminar();
                        midlet.ponerPantalla(new Historia(midlet,0,0,0));
                        midlet = null;
                    }else{
                        terminar();
                        System.out.println(midlet.getSexoGuardado()+","+ midlet.getNivelGuardado()+","+  midlet.getScoreGuardado()+","+ midlet.getEdoShooter());
                        midlet.ponerPantalla(new Juego(midlet, midlet.getSexoGuardado(), midlet.getNivelGuardado(), midlet.getScoreGuardado(),midlet.getEdoShooter()));
                        midlet = null;
                    }
                    //midlet = null;
                    break;
                case 2:
                    terminar();
                    midlet.ponerPantalla(new Pantalla(midlet,Pantalla.MEJORES));
                    midlet = null;
                    break;
                case 3:
                    terminar();
                    midlet.ponerPantalla(new Pantalla(midlet,Pantalla.AYUDA));
                    midlet = null;
                    break;
                case 4:
                    terminar();
                    midlet.ponerPantalla(new Pantalla(midlet, Pantalla.CREDITOS));
                    midlet = null;
                    break;
                case 5:
                    terminar();
                    midlet.ponerPantalla(new Pantalla(midlet, Pantalla.OPCIONES));
                    break;
                case 6:
                    terminar();
                    midlet.ponerPantalla(new Pantalla(midlet, Pantalla.SALIR));
                    midlet = null;
                    break;
                default:
                    break;
            }
        }else if(tipo == SELECCION){
            terminar();
            midlet.ponerPantalla(new Historia(midlet, indice, 1,0));
            midlet = null;

        }


    }
    /**
     * Metodo que posiciona el menú en la nueva opción.
     * @param indice Tipo int que dirá en qué posición
     */
    public void setPosicion(int indice){
        this.indice = indice;
        fondoMenu.setX(-indice*ANCHO);
    }

    /**
     * Método que termina todos los atributos del menú y manda a null todo.
     */
    public void terminar() {
        fondoMenu.terminar();
        fondoMenu = null;
        g = null;
        animador.terminar();
        animador = null;
    }

}
